package com.example;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
//import com.baomidou.mybatisplus.generator.FastAutoGenerator;
//import com.baomidou.mybatisplus.generator.IFill;
//import com.baomidou.mybatisplus.generator.config.OutputFile;
//import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
//import com.baomidou.mybatisplus.generator.fill.Column;
//import com.github.yulichang.base.MPJBaseMapper;
//import com.github.yulichang.base.MPJBaseService;
//import com.github.yulichang.base.MPJBaseServiceImpl;

import java.io.File;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * 数据库模型生成器
 *
 * @author 毛宇鹏
 * @date 创建于 13:26 2019-08-07
 */
public final class DbGenerator {
    /**
     * 请设置数据库登录名和密码
     */
    private static final String DB_USER = "root";

    /**
     * 数据库登录密码
     */
    private static final String DB_PASSWORD = "root";

    /**
     * 数据库名称
     */
    private static final String DB_NAME = "work-dynamic-circle";

    /**
     * 聚合名称（一个聚合对应一个仓储）
     */
    private static final String MODULE_NAME = "user";

    /**
     * 如果工程在根目录下，可填写为 "/"，如果有父级目录，则需要填写父级目录前缀，如："mao-ddd-service/"
     */
    private static final String PROJECT_DIR = "service" + File.separator + "owner" + File.separator + "owner-infrastructure" + File.separator;

    /**
     * 当前工程目录名称
     */
    private static final String PROJECT_NAME = "";

    /**
     * 仓储目录包名
     */
    private static final String PACKAGE_PARENT = "cn.com.jarvisbim.ocean.service.owner.infrastructure";

    /**
     * 数据库JDBC连接URL
     */
    private static final String DB_URL = "jdbc:mysql://localhost:3306/%s?useUnicode=true&useSSL=false&characterEncoding=utf8";

    /**
     * 在类的合适位置定义常量
     */
    private static final String WILDCARD = "*";

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + "：");
        if (scanner.hasNext()) {
            String ipt = scanner.next();

            if (!com.baomidou.mybatisplus.core.toolkit.StringUtils.isEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }

//    public static void main(String[] args) {
//        String projectPath = System.getProperty("user.dir");
//
//        FastAutoGenerator
//                // 创建Datasource
//                .create(String.format(DB_URL, DB_NAME), DB_USER, DB_PASSWORD)
//                // 全局配置
//                .globalConfig(builder -> builder
//                        .author("毛宇鹏")
//                        .commentDate("yyyy-MM-dd hh:mm:ss")
//                        .outputDir(projectPath + File.separator + PROJECT_DIR + PROJECT_NAME + File.separator + "src" + File.separator + "main" + File.separator + "java")
//                        .disableOpenDir())
//                // 字段类型映射配置
//                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
//                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
//                    if (typeCode == Types.SMALLINT || typeCode == Types.TINYINT) {
//                        // 自定义类型转换
//                        return DbColumnType.INTEGER;
//                    }
//                    return typeRegistry.getColumnType(metaInfo);
//                }))
//                // 包路径配置
//                .packageConfig(builder -> builder
//                        .parent(PACKAGE_PARENT)
//                        .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + File.separator + PROJECT_DIR + PROJECT_NAME + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + MODULE_NAME))
//                        .entity("gateway." + MODULE_NAME + ".repository.po")
//                        .mapper("gateway." + MODULE_NAME + ".repository.mapper")
//                        .service("gateway." + MODULE_NAME + ".repository.facade")
//                        .serviceImpl("gateway." + MODULE_NAME + ".repository.persistence"))
//                // 构建策略配置
//                .strategyConfig(builder -> {
//                    // 实体类配置
//                    List<IFill> tableFills = new ArrayList<>();
//                    tableFills.add(new Column("created", FieldFill.INSERT));
//                    tableFills.add(new Column("updated", FieldFill.INSERT_UPDATE));
//                    builder.entityBuilder()
//                            .enableLombok()
//                            .enableFileOverride()
//                            // 标记成 逻辑删除
////                            .logicDeleteColumnName("deleted")
////                            .disableSerialVersionUID()
//                            .enableChainModel()
////                            .enableColumnConstant()
//                            .enableRemoveIsPrefix()
//                            .enableTableFieldAnnotation()
//                            .versionColumnName("version")
//                            .addTableFills(tableFills)
//                            .naming(NamingStrategy.underline_to_camel)
//                            .columnNaming(NamingStrategy.underline_to_camel)
//                            .convertFileName(c -> c.concat("PO"));
//
//                    // Mapper配置
//                    builder.mapperBuilder()
//                            .enableBaseResultMap()
//                            .enableFileOverride()
//                            // mybatis plus join
//                            .superClass(MPJBaseMapper.class)
//                            .convertMapperFileName(c -> c.concat("Mapper"));
//
//                    // Service 配置
//                    builder.serviceBuilder()
//                            .enableFileOverride()
//                            // mybatis plus join
//                            .superServiceClass(MPJBaseService.class)
//                            .superServiceImplClass(MPJBaseServiceImpl.class)
//                            .convertServiceFileName(c -> c.concat("ServiceI"))
//                            .convertServiceImplFileName(c -> c.concat("ServiceImpl"));
////                            .convertServiceFileName(c -> c.concat("RepositoryI"))
////                            .convertServiceImplFileName(c -> c.concat("RepositoryImpl"));
//
//                    // Controller 配置
//                    builder.controllerBuilder().disable();
//                    // 名称为空，则不会输出Controller文件
//                    // .formatFileName(null);
//
//                    String scanner = scanner("表名，多个英文逗号分割,全部输入 *");
//                    if (scanner == null || scanner.equals("")) {
//                        throw new RuntimeException("没有输入表名");
//                    }
//
//                    if (!WILDCARD.equalsIgnoreCase(scanner)) {
//                        builder.addInclude(scanner.split(","));
//                    }
//                })
//                .execute();
//    }
}
